package com.ctrip.corp.obt.shard.annotation;

import com.ctrip.corp.obt.shard.handler.strategy.ITableRouteStrategy;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author marco.zheng
 * @version 1.0
 * @date 2021/05/06
 * @desc 通过将该注解添加到方法上，声明是否需要过滤对应的表，过滤之后该表的数据源为默认数据源，或者自行配置数据源
 * @see
 * @since 1.0
 */
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ShardModel {

    /**
     * 默认的data source的key，key对应的是corp_code
     * 注意⚠️如果要使用targetDataSource属性，指定要使用的数据源
     * 则不能在添加了 {@link org.springframework.transaction.annotation.Transactional} 注解的方法下游使用
     * 否则会导致事务回滚出现问题，数据源必须在事务产生之前确定下来
     */
    String targetDataSource() default "";

    /**
     * 默认不配置该属性且配置了 {@link ShardModel#tableShardStrategy()} 则分表策略对当前线程中所有的表生效
     * example：比如现在一个事务中包含对user_info和appointment进行操作，分片策略为hash，那么会按照租户id分片到user_info_1 和appointment_1
     * 如果只希望对appointment进行分片，那么targetTables配置appointment即可，多个表用逗号分隔，如 user_info,appointment
     * @return
     */
    String targetTables() default "";

    /**
     * 表分片策略{@link ITableRouteStrategy#strategyName()} (可选，默认不做table route)
     * default {@link com.ctrip.corp.obt.shard.handler.strategy.DefaultTableRouteStrategy}
     * hash {@link com.ctrip.corp.obt.shard.handler.strategy.HashTableRouteStrategy}
     * date {@link com.ctrip.corp.obt.shard.handler.strategy.DateTableRouteStrategy}
     * @return strategy
     */
    String tableShardStrategy() default "";

}
